#include <stdio.h>
/*
 * 位运算符    <<  、 >>  、   ~   、    |  、    ^   、   &
 *            左移、 右移、 按位取反、 按位或、 按位异或、  按位与
 * 位运算符只能用于对整形数据进行操作
 */
int main() {
    short i=5;
    short j;
    j=i<<1;//5:0000 0000 0000 0101  左移一位之后得：  0000 0000 0000 1010:10
    printf("l_j=%d\n",j);
    j=i>>1;//5:0000 0000 0000 0101  右移一位之后得：  0000 0000 0000 0010:2
    printf("r_j=%d\n",j);
    i = 0x8011;//B:1000 0000 0001 0001    D:-32751
    unsigned short s=0x8011;//无符号短整型
    unsigned short r=0;
    j=i>>1;//j:(B:1100 0000 0000 1000    D:-16376)
    r=s>>1;//j:(B:0100 0000 0000 1000    D:16392)
    printf("j=%d r=%u\n",j,r);//无符号数所有位都用来存储数值，只能表示正数，移位运算也是遵循正数得标准
    //按位取反、按位或、按位异或、按位与
    i=5,j=7;
    printf("i & j=%d\n", i & j);/*   0000 0000 0000 0101     按位与：1&1为1，0&1、1&0、0&0都为0
                                             0000 0000 0000 0111
                                             0000 0000 0000 0101     结果为5   */
    printf("i | j=%d\n", i | j);/*   0000 0000 0000 0101     按位或：1|1、0|1、1|0都为1，0|0为0
                                             0000 0000 0000 0111
                                             0000 0000 0000 0111     结果为7   */
    printf("i ^ j=%d\n", i ^ j);/*   0000 0000 0000 0101     按位异或：1^1、0^0为0，0^1、1^0都为1
                                             0000 0000 0000 0111             （同性相斥、异性相吸）
                                             0000 0000 0000 0010     结果为2   */
    printf("~i=%d\n", ~i);      /*   0000 0000 0000 0101     按位取反
                                             1111 1111 1111 1010     结果为-6   */
    return 0;
}
